home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
SPACE 2
/
SPACE - Library 2 - Volume 1.iso
/
apps
/
93
/
applic
/
sdbiex.c
< prev
next >
Wrap
C/C++ Source or Header
|
1987-01-15
|
7KB
|
277 lines
/* SDB - import/export command routines */
#include "sdbio.h"
extern int dbv_token;
extern char dbv_tstring[];
extern int dbv_tvalue;
/* db_import - import tuples from a file */
int *db_import(fmt,a1,a2,a3,a4,a5,a6,a7,a8,a9)
char *fmt;
{
struct scan *sptr;
struct attribute *aptr;
char fname[STRINGMAX+1],avalue[STRINGMAX+1];
int tcnt,astart,i,eofile;
FILE *fp;
/* check for a command line */
if (fmt != NULL)
db_scan(fmt,a1,a2,a3,a4,a5,a6,a7,a8,a9);
/* checks for "<filename> into <relation-name>" */
if (db_ntoken() == ID)
strcat(dbv_tstring,".dat");
else if (dbv_token != STRING)
return (db_nerror(SYNTAX));
strcpy(fname,dbv_tstring);
if (db_ntoken() != INTO)
return (db_nerror(SYNTAX));
if (db_ntoken() != ID)
return (db_nerror(SYNTAX));
/* open the relation */
if ((sptr = db_ropen(dbv_tstring)) == NULL)
return (FALSE);
/* open the input file */
if ((fp = fopen(fname,"r")) == NULL)
return (db_nerror(INPFNF));
/* import tuples */
eofile = FALSE;
for (tcnt = 0; ; tcnt++) {
/* get attribute values */
astart = 1;
for (i = 0; i < NATTRS; i++) {
/* get a pointer to the current attribute */
aptr = &sptr->sc_relation->rl_header.hd_attrs[i];
/* check for the last attribute */
if (aptr->at_name[0] == 0)
break;
/* input the tuple */
if (fgets(avalue,STRINGMAX,fp) == 0) {
eofile = TRUE;
break;
}
avalue[strlen(avalue)-1] = EOS;
/* store the attribute value */
db_aput(aptr,&sptr->sc_tuple[astart],avalue);
/* update the attribute start */
astart += aptr->at_size;
}
/* store the new tuple */
if (!eofile) {
if (!db_rstore(sptr)) {
db_rclose(sptr);
return (FALSE);
}
}
else
break;
}
/* close the relation */
db_rclose(sptr);
/* close the input file */
fclose(fp);
/* check number of tuples imported */
if (tcnt != 0) {
/* print tuple count */
printf("[ %d imported ]\n",tcnt);
}
else
printf("[ none imported ]\n");
/* return successfully */
return (TRUE);
}
/* db_export - export tuples to a file */
int *db_export(fmt,a1,a2,a3,a4,a5,a6,a7,a8,a9)
char *fmt;
{
struct scan *sptr;
struct attribute *aptr;
char rname[STRINGMAX+1],avalue[STRINGMAX+1];
int tcnt,astart,i;
FILE *fp;
/* check for a command line */
if (fmt != NULL)
db_scan(fmt,a1,a2,a3,a4,a5,a6,a7,a8,a9);
/* checks for "<relation-name> [ into <filename> ]" */
if (db_ntoken() != ID)
return (db_nerror(SYNTAX));
strcpy(rname,dbv_tstring);
if (!db_to(&fp,".dat"))
return (FALSE);
/* open the relation */
if ((sptr = db_ropen(rname)) == NULL)
return (FALSE);
/* export tuples */
for (tcnt = 0; db_rfetch(sptr); tcnt++) {
/* get attribute values */
astart = 1;
for (i = 0; i < NATTRS; i++) {
/* get a pointer to the current attribute */
aptr = &sptr->sc_relation->rl_header.hd_attrs[i];
/* check for the last attribute */
if (aptr->at_name[0] == 0)
break;
/* get the attribute value */
db_aget(aptr,&sptr->sc_tuple[astart],avalue);
/* output the tuple */
fprintf(fp,"%s\n",avalue);
/* update the attribute start */
astart += aptr->at_size;
}
}
/* close the relation */
db_rclose(sptr);
/* close the output file */
if (fp != stdout)
fclose(fp);
/* check number of tuples exported */
if (tcnt != 0) {
/* print tuple count */
printf("[ %d exported ]\n",tcnt);
}
else
printf("[ none exported ]\n");
/* return successfully */
return (TRUE);
}
/* db_squeeze - squeeze deleted tuples from a relation file */
int *db_squeeze(fmt,a1,a2,a3,a4,a5,a6,a7,a8,a9)
char *fmt;
{
struct scan *sptr;
/* check for a command line */
if (fmt != NULL)
db_scan(fmt,a1,a2,a3,a4,a5,a6,a7,a8,a9);
/* checks for "<relation-name>" */
if (db_ntoken() != ID)
return (db_nerror(SYNTAX));
/* open the relation */
if ((sptr = db_ropen(dbv_tstring)) == NULL)
return (FALSE);
/* compress the relation file */
if (!db_rcompress(sptr)) {
db_rclose(sptr);
return (FALSE);
}
/* close the relation */
db_rclose(sptr);
/* return successfully */
return (TRUE);
}
/* db_extract - extract a relation definition */
int *db_extract(fmt,a1,a2,a3,a4,a5,a6,a7,a8,a9)
char *fmt;
{
struct scan *sptr;
struct attribute *aptr;
char rname[STRINGMAX+1],aname[ANSIZE+1],*atype;
int i;
FILE *fp;
/* check for a command line */
if (fmt != NULL)
db_scan(fmt,a1,a2,a3,a4,a5,a6,a7,a8,a9);
/* checks for "<relation-name> [ into <filename> ]" */
if (db_ntoken() != ID)
return (db_nerror(SYNTAX));
strcpy(rname,dbv_tstring);
if (!db_to(&fp,".def"))
return (FALSE);
/* open the relation */
if ((sptr = db_ropen(rname)) == NULL)
return (FALSE);
/* output the relation definition */
fprintf(fp,"create %s (\n",rname);
/* get attribute values */
for (i = 0; i < NATTRS; i++) {
/* get a pointer to the current attribute */
aptr = &sptr->sc_relation->rl_header.hd_attrs[i];
/* check for the last attribute */
if (aptr->at_name[0] == 0)
break;
/* get the attribute name */
strncpy(aname,aptr->at_name,ANSIZE); aname[ANSIZE] = 0;
/* determine the attribute type */
switch (aptr->at_type) {
case TCHAR:
atype = "char";
break;
case TNUM:
atype = "num";
break;
default:
atype = "<error>";
break;
}
/* output the attribute definition */
if (strlen(aname) < 8)
fprintf(fp,"\t%s\t\t%s\t%d\n",aname,atype,aptr->at_size);
else
fprintf(fp,"\t%s\t%s\t%d\n",aname,atype,aptr->at_size);
}
/* output the relation size */
fprintf(fp,") %d %d\n",sptr->sc_relation->rl_tmax,
sptr->sc_relation->rl_text);
/* close the relation */
db_rclose(sptr);
/* close the output file */
if (fp != stdout)
fclose(fp);
/* return successfully */
return (TRUE);
}